#ifndef _KRLDEVICE_T_H_
#define _KRLDEVICE_T_H_

#include <spinlock_t.h>
#include <list_t.h>
#include <krlsem_t.h>

/* IO分发函数 */

enum IOIF_CODE
    {
    IOIF_CODE_OPEN = 0,     /* 对应 open 操作 */
    IOIF_CODE_CLOSE,        /* 对应 close 操作 */
    IOIF_CODE_READ,         /* 对应 read 操作 */
    IOIF_CODE_WRITE,        /* 对应 write 操作 */
    IOIF_CODE_LSEEK,        /* 对应 lseek 操作 */
    IOIF_CODE_IOCTL,        /* 对应 ioctl 操作 */
    IOIF_CODE_START,        /* 对应 start 操作 */
    IOIF_CODE_STOP,         /* 对应 stop 操作 */
    IOIF_CODE_POWERSET,     /* 对应 powerset 操作 */
    IOIF_CODE_ENUMDEV,      /* 对应 enum dev 操作 */
    IOIF_CODE_FLUSH,        /* 对应 flush 操作 */
    IOIF_CODE_SHUTDOWN,     /* 对应 shutdown 操作 */
    };

/* 操作码的最大值和最小值 */

#define IOIF_OPCODE_MAX     IOIF_CODE_SHUTDOWN
#define IOIF_OPCODE_MIN     IOIF_CODE_OPEN

/* 分发函数类型最大值 */

#define DEV_OPCODE_MAX      (IOIF_OPCODE_MAX + 1)

/* 系统设备分类 */

enum DEVICE_CLASSIFY
    {
    DEVICE_CLASSITY_NOT = 0,           /* 不表示任何设备 */
    DEVICE_CLASSITY_AMBABUS,           /* AMB总线设备 */
    DEVICE_CLASSITY_AHBBUS,            /* AHB总线设备 */
    DEVICE_CLASSITY_APBBUS,            /* APB总线设备 */
    DEVICE_CLASSITY_BRIDGE,            /* 总线桥接器设备 */
    DEVICE_CLASSITY_CPUCORE,           /* CPU设备 */
    DEVICE_CLASSITY_RAMCONTER,         /* 内存控制器设备 */
    DEVICE_CLASSITY_RAM,               /* 内存设备 */
    DEVICE_CLASSITY_USBHOSTCONTER,     /* USB主控制器设备 */
    DEVICE_CLASSITY_INTUPTCONTER,      /* 中断控制器设备 */
    DEVICE_CLASSITY_DMA,               /* DMA设备 */
    DEVICE_CLASSITY_CLOCKPOWER,        /* 时钟电源设备 */
    DEVICE_CLASSITY_LCDCONTER,         /* LCD控制器设备 */
    DEVICE_CLASSITY_NANDFLASH,         /* NADNFLASH设备 */
    DEVICE_CLASSITY_CAMERA,            /* 摄像头设备 */
    DEVICE_CLASSITY_UART,              /* 串口设备 */
    DEVICE_CLASSITY_TIMER,             /* 定时器设备 */
    DEVICE_CLASSITY_USB,               /* USB设备 */
    DEVICE_CLASSITY_WATCHDOG,          /* 看门狗设备 */
    DEVICE_CLASSITY_IIC,               /* IIC设备 */
    DEVICE_CLASSITY_IIS,               /* IIS设备 */
    DEVICE_CLASSITY_GPIO,              /* GPIO设备 */
    DEVICE_CLASSITY_RTC,               /* RTC设备 */
    DEVICE_CLASSITY_ADC,               /* ADC设备 */
    DEVICE_CLASSITY_SPI,               /* SPI设备 */
    DEVICE_CLASSITY_SD,                /* SDCard设备 */
    DEVICE_CLASSITY_AUDIO,             /* 音频设备 */
    DEVICE_CLASSITY_TOUCH,             /* 触摸设备 */
    DEVICE_CLASSITY_NETWORK,           /* 网络设备 */
    DEVICE_CLASSITY_VIR,               /* 虚拟设备 */
    DEVICE_CLASSITY_FILESYS,           /* 文件系统设备 */
    DEVICE_CLASSITY_SYSTICK,           /* 系统时钟设备 */
    DEVICE_CLASSITY_UNKNOWN,           /* 未知设备 */
    };

/* 文件设备访问位码 */

enum FSDEV_ACSFLG_CODE
    {
    FSDEV_OPFLG_NEWFILE = 1,           /* 打开文件 (创建新文件) */
    FSDEV_OPFLG_OPNFILE = 2,           /* 打开文件 (已存在的文件) */
    FSDEV_IOCTL_DELFILE = 5,           /* 删除文件 */
    };

#define DEVICE_CLASSITY_MAX_NBR   (DEVICE_CLASSITY_UNKNOWN + 1) /* 系统支持的最大设备分类数量 */

/* 设备属性类型 */

#define DEV_ATTRFLG_EXCLU       (1 << 0)
#define DEV_ATTRFLG_SHARE       (1 << 1)    /* 设备属性标识: 共享设备 */
#define DEV_ATTRSTS_NORMAL      (1 << 0)    /* 设备属性状态: 正常状态 */
#define DEV_ATTRSTS_FAILU       (1 << 1)    /* 设备属性状态: 异常状态 */
#define DEV_ATTRFORM_IDN        1           /* 驱动访问形式 (直接 访问 devid_t 数据结构) */
#define DEV_ATTRFORM_FLN        2           /* 驱动访问形式 (类Linux 驱动模型纳入 文件系统的 形式) */

/* 设备ID数据结构 */

typedef struct s_DEVID
    {
    enum DEVICE_CLASSIFY majtype;  /* 设备类型 */
    enum DEVICE_CLASSIFY subtype;  /* 子设备类型 */
    uint_t               index;    /* 设备序号 */
    } devid_t;

/* 设备表数据结构 */

typedef struct s_DEVCLASSLST
    {
    enum DEVICE_CLASSIFY type;            /* 设备类型 */
    uint_t               count;           /* 设备计数 */
    list_t               list;            /* 挂载设备 device_t 结构体的链表 */
    } devclasslst_t;

/* 设备管理表 */

typedef struct s_DEVTABLE
    {
    spinlock_t     lock;                                /* 设备表自旋锁 */
    list_t         list;                                /* 设备表自身的链表 */
    list_t         devlist;                             /* 全局设备链表 */
    list_t         drvlist;                             /* 全局驱动链表 */
    uint_t         devcount;                            /* 全局设备计数 */
    uint_t         drvcount;                            /* 全局驱动计数 */
    devclasslst_t  classlist[DEVICE_CLASSITY_MAX_NBR];  /* 分类存放设备数据结构的 devlist_t 结构数组 */
    } devtable_t;

/* 设备数据结构 */

typedef struct s_DEVICE
    {
    spinlock_t        lock;               /* 保护设备数据结构的自旋锁 */
    list_t            list;               /* 设备链表 */
    list_t            drvlist;            /* 设备在驱动程序数据结构中对应的挂载链表 (一个驱动程序可能不止管理一个设备, 所以需要用链表挂载多个设备) */
    list_t            tbllist;            /* 设备在设备数据结构中对应的挂载链表 (为了方便查找所有的 device_t 结构) */
    uint_t            count;              /* 设备计数器 */
    sem_t             sem;                /* 信号量 */
    uint_t            status;             /* 设备相关状态 */
    uint_t            flag;               /* 设备相关标志位 */
    devid_t           id;                 /* 设备ID */
    list_t            isrlist;            /* 设备中断服务例程的链表 (挂载 intisrdsc_t 结构) */
    uint_t            isrnbr;             /* 设备中断服务例程的个数 */
    list_t            rqlist;             /* 对设备请求服务链表 */
    uint_t            rqnbr;              /* 对设备请求服务个数 */
    sem_t             sem_waitdev;        /* 对于等待设备的信号量 */
    struct s_DRIVER * driver;             /* 设备对应的驱动程序数据结构的指针 */
    void *            attribute;          /* 设备属性指针 */
    void *            private_data;       /* 设备私有数据指针 */
    void *            user_data;          /* 设备用户数据指针 */
    void *            exp_data;           /* 拓展数据 */
    char_t *          name;               /* 设备名 */
    } device_t;

/* 函数指针原形 */

typedef drvstus_t (*drvcallfunc_t) (device_t * device, void * param);
typedef drvstus_t (*drventry_t) (struct s_DRIVER *, uint_t, void *);
typedef drvstus_t (*drvexit_t) (struct s_DRIVER *, uint_t, void *);

/* 驱动程序数据结构 */

typedef struct s_DRIVER
    {
    spinlock_t    lock;                        /* 保护驱动程序数据结构的自旋锁 */
    list_t        list;                        /* 挂载驱动程序数据结构的链表 */
    uint_t        status;                      /* 驱动程序的相关状态 */
    uint_t        flag;                        /* 驱动程序的相关标志 */
    uint_t        id;                          /* 驱动程序ID序号*/
    uint_t        refcnt;                      /* 驱动程序引用计数器 */
    sem_t         sem;                         /* 信号量 */
    void *        safedsc;                     /* 驱动程序的安全体 */
    void *        attribute;                   /* 内核要求的驱动程序属性体 */
    void *        private_data;                /* 驱动程序私有数据指针 */
    void *        user_data;
    drvcallfunc_t dipfunc[DEV_OPCODE_MAX];     /* 驱动程序功能派发函数指针数组 */
    list_t        alldevlist;                  /* 挂载驱动程序所管理的所有设备链表 */
    drventry_t    drventry;                    /* 驱动程序入口函数指针 */
    drvexit_t     drvexit;                     /* 驱动程序出口函数指针 */
    char_t *      name;                        /* 驱动程序的名字 */
    } driver_t;

#endif
